package inits

import (
	"context"
	"fmt"
	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo"
	"go.mongodb.org/mongo-driver/mongo/options"
	"log"
	"smart-health-platforms/config"
	"strings"
	"time"
)

func InitMongoDB() {
	// 设置连接选项
	data := config.AppCong.MongoDB
	opts := options.Client().ApplyURI(fmt.Sprintf(
		"mongodb://%s:%s@%s:%d/?compressors=snappy,zlib,zstd",
		data.User, data.Password, data.Host, data.Port))

	// 设置连接超时
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()

	// 建立连接
	client, err := mongo.Connect(ctx, opts)
	if err != nil {
		panic(err)
	}
	// 检查连接
	err = client.Ping(ctx, nil)
	if err != nil {
		panic(err)
	}
	log.Println("mongodb init success")

	// 初始化健康数据库
	config.HealthDB = client.Database("health")

	// 初始化各个集合
	config.Coll = config.HealthDB.Collection("user_auth")
	config.CleanedCollection = config.HealthDB.Collection("cleaned_health_data")

	// 创建索引
	createIndexes()
}

func createIndexes() {
	// 为健康数据创建索引
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	// 用户ID索引
	_, err := config.CleanedCollection.Indexes().CreateOne(ctx, mongo.IndexModel{
		Keys: bson.M{"user_id": 1},
	})
	if err != nil {
		log.Printf("创建user_id索引失败: %v", err)
	}

	// 时间索引
	_, err = config.CleanedCollection.Indexes().CreateOne(ctx, mongo.IndexModel{
		Keys: bson.M{"collection_time": -1},
	})
	if err != nil {
		log.Printf("创建collection_time索引失败: %v", err)
	}
}
func InitCounter(collectionName string) error {
	ctx := context.Background()
	counterCol := config.HealthDB.Collection("counters")
	// 插入初始计数（若不存在则创建，存在则忽略）
	_, err := counterCol.InsertOne(ctx, bson.M{
		"_id": collectionName, // 用业务集合名作为计数器的 _id
		"seq": 0,              // 初始计数为 0
	})
	if err != nil {
		// 忽略“重复键”错误（已存在时无需处理）
		if !strings.Contains(err.Error(), "E11000") {
			return err
		}
	}
	return nil
}
func GetNextID(collectionName string) (int, error) {
	ctx := context.Background()
	counterCol := config.HealthDB.Collection("counters")

	// 原子递增计数
	result := counterCol.FindOneAndUpdate(ctx,
		bson.M{"_id": collectionName},                                               // 查询条件：业务集合名
		bson.M{"$inc": bson.M{"seq": 1}},                                            // 递增操作
		options.FindOneAndUpdate().SetUpsert(true).SetReturnDocument(options.After), // 不存在则创建
	)
	if result.Err() != nil {
		return 0, result.Err()
	}

	// 解析返回的计数
	var counter struct {
		Seq int `bson:"seq"`
	}
	if err := result.Decode(&counter); err != nil {
		return 0, err
	}
	return counter.Seq, nil
}
